import { defineStore } from 'pinia'
import logger from '@/utils/logger'

// #ifdef H5 || APP-PLUS
import extJson from '@/ext.json'
// #endif

type AppInfo = {
  appId: string
  appName: string
  appAvatar: string
  appKey?: string
}

type AppConfig = {
  /** 小程序封面图5:4 */
  headPicture: string,
  /** 是否需要电话授权 */
  isNeedPhoneAuth: number,
  /** 集团code */
  groupCode: string,
  /** 主题 */
  colorConfig: string | object,
  isOpenEnterprise: Boolean,
  /** 扩展功能 */
  extra: Array<string>,
  reserveAutoReply: number,
  serviceCode?: any,
  template: number,
  /** 微场景 */
  microSceneList: Array<Object>,
  /** 小程序官方顾问 */
  officialUser: {
    projectCode: string,
    rid: string,
    userUuid: string
  }
}

const getAppInfo = () => {
  let appExtConfig: AppInfo = {
    appId: '',
    appName: '',
    appAvatar: '',
  }

  // #ifdef MP-WEIXIN
  appExtConfig = uni.getExtConfigSync()
  // #endif

  // #ifdef MP-BAIDU
  appExtConfig = uni.getExtConfigSync().extConfig
  // #endif

  // #ifdef H5 || APP-PLUS
  // TODO: H5小程序配置 & APP配置
  appExtConfig = extJson.ext
  // #endif

  // #ifdef MP-TOUTIAO
  // TODO: 头条小程序小程序配置
  // #endif

  return appExtConfig
}

// @ts-ignore 默认值初始化
const appLaunchShowOption: App.LaunchShowOption = {}
// @ts-ignore 默认值初始化
const appConfig: AppConfig = {}
const appInfo: AppInfo = getAppInfo()

export const useAppStore = defineStore('app', {
  state: () => {
    return {
      // 系统配置
      systemInfo: uni.getSystemInfoSync(),
      // 应用启动参数，全局只触发一次
      launchOptions: uni.getLaunchOptionsSync(),
      // 应用前台展示携带的参数，app onshow时触发
      appLaunchShowOption,
      // 应用基本信息
      appInfo,
      /**
       * 应用配置信息，异步获取
       * | 参数 | 含义 |
       * | :------ | :------|
       * | headPicture | 小程序封面图5:4 |
       * | isNeedPhoneAuth | 是否需要电话授权 |
       * | groupCode | 集团code |
       * | colorConfig | 主题色 |
       * | isOpenEnterprise |  |
       * | extra | 扩展功能 |
       * | reserveAutoReply |  |
       * | serviceCode |  |
       * | template | 主题 |
       * | microSceneList | 微场景 |
       * | officialUser | 小程序官方顾问 |
       */
      appConfig,
    }
  },
  actions: {
    /**
     * 设置应用前台显示携带的参数
     * @param options 前台携带参数
     */
    setLaunchShowOption (options: App.LaunchShowOption) {
      this.appLaunchShowOption = options
      logger.info('appLaunchShowOption', options)
    },
    /**
     * 设置小程序配置信息
     * @param config 配置
     */
    setAppConfig (config: AppConfig) {
      this.appConfig = config
      uni.setStorageSync('appConfig', config)
      logger.info('appConfig', config)
    },
  },
  getters: {
    isMultiApplet: (state) => state.appConfig.template === 1,
  },
})
